package cn.yx.common.core.util.http.okhttp;

import lombok.extern.slf4j.Slf4j;
import okhttp3.Cookie;
import okhttp3.Request;

import java.util.List;
import java.util.Map;

/**
 * <p>Http Get请求类</p>
 * <p>封装了部分可直接调用的get方法，如果没有合适的get方法，则可以调用buildRequest方法获得Request对象后，再调用executeRequest方法。</p>
 *
 * @author Wgssmart
 */
@Slf4j
public class HttpGetUtil extends HttpBasic {

    /**
     * HTTP GET请求访问指定的url
     *
     * @param url url,包括查询字符串
     * @return 指定url所返回的字符串数据
     */
    public static String get(String url) {
        return executeRequest(buildRequest(url, null), null, false);
    }

    /**
     * HTTP GET请求访问指定的url
     *
     * @param url     url,包括查询字符串
     * @param headers headers头部数据
     * @return 指定url所返回的字符串数据
     */
    public static String get(String url, Map<String, String> headers) {
        return executeRequest(buildRequest(url, headers), null, false);
    }

    /**
     * HTTP GET请求访问指定的url。可通过getCookies方法获取返回的cookie
     *
     * @param url          url,包括查询字符串
     * @param headers      headers头部数据
     * @param cookieList   提交的Cookie集合
     * @param returnCookie 是否从服务端获取cookie
     * @return 指定url所返回的字符串数据
     */
    public static String get(String url, Map<String, String> headers, List<Cookie> cookieList, boolean returnCookie) {
        return executeRequest(buildRequest(url, headers), cookieList, returnCookie);
    }

    /**
     * HTTP GET请求访问指定的url。可通过getCookies方法获取返回的cookie
     *
     * @param url          url,包括查询字符串
     * @param cookieList   提交的Cookie集合
     * @param returnCookie 是否从服务端返回cookie
     * @return 指定url所返回的字符串数据
     */
    public static String get(String url, List<Cookie> cookieList, boolean returnCookie) {
        return executeRequest(buildRequest(url, null), cookieList, returnCookie);
    }

    /**
     * 发送HTTP GET请求，并且需要指定相应的ResponseHandler，同时还可以指定数字证书与协议
     *
     * @param url          url,包括查询字符串
     * @param certPath     证书路径
     * @param certPassword 证书密码
     * @param certType     证书类型
     * @param sslProtocols ssl协议数组
     * @return 通过在ResponseHandler中指定的具体类型来返回响应数据
     */
    public static String get(String url, String certPath, String certPassword, String certType, String[] sslProtocols) {
        // return executeRequest(buildRequest(url, null), certPath, certPassword, certType, sslProtocols);
        return null;
    }

    /**
     * 创建Request对象，可指定Headers
     *
     * @param url
     * @param headers
     * @return
     */
    public static Request buildRequest(String url, Map<String, String> headers) {
        Request.Builder requestBuilder = new Request.Builder();
        setHeaders(requestBuilder, headers);
        requestBuilder.url(url).build();
        return requestBuilder.build();
    }

}
